﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Web7.Tests.Web7.ExceptionHandling
{
	/// <summary>
	/// ExceptionLevel 的摘要说明
	/// </summary>
	[TestClass]
	public class ExceptionLevelTest
	{
		public ExceptionLevelTest()
		{
		}

		private TestContext _testContext;

		/// <summary>
		///获取或设置测试上下文，该上下文提供
		///有关当前测试运行及其功能的信息。
		///</summary>
		public TestContext TestContext
		{
			get
			{
				return _testContext;
			}
			set
			{
				_testContext = value;
			}
		}

		#region 附加测试特性
		//
		// 编写测试时，可以使用以下附加特性:
		//
		// 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
		// [ClassInitialize()]
		// public static void MyClassInitialize(TestContext testContext) { }
		//
		// 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
		// [ClassCleanup()]
		// public static void MyClassCleanup() { }
		//
		// 在运行每个测试之前，使用 TestInitialize 来运行代码
		// [TestInitialize()]
		// public void MyTestInitialize() { }
		//
		// 在每个测试运行完之后，使用 TestCleanup 来运行代码
		// [TestCleanup()]
		// public void MyTestCleanup() { }
		//
		#endregion

		[TestMethod]
		public void DefaultExceptionLevel()
		{
			try
			{
				// for test usage only, just ignore this token when maintaining the project
				throw new NotImplementedException("Some Function is not implemented here");
			}
			catch(Exception e)
			{
				Assert.AreEqual(OperationProcessLevel.Warning, e.GetLevel());
			}

			try
			{
				throw new ArgumentException("100+ arguments is not assigned");
			}
			catch(Exception e)
			{
				Assert.AreEqual(OperationProcessLevel.Warning, e.GetLevel());
			}


			try
			{
				throw new DivideByZeroException("Number could be zero");
			}
			catch(Exception ex)
			{
				Assert.AreEqual(OperationProcessLevel.Error, ex.GetLevel());
			}
		}

		[TestMethod]
		public void SetExceptionLevel()
		{
			Exception ex;
			try
			{
				throw new System.IO.IOException("Disk is not available");
			}
			catch(System.IO.IOException e)
			{
				ex = e;
			}


			Assert.AreNotEqual(OperationProcessLevel.Fatal, ex.GetLevel());
			ex.SetLevel(OperationProcessLevel.Fatal);
			Assert.AreEqual(OperationProcessLevel.Fatal, ex.GetLevel());
		}
	}
}
